﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace Avanservices.ControlPanel
{
    public partial class Perfil : System.Web.UI.UserControl
    {
        Variables var;
        ReglasNegocio.clsPerfil _perfil;
        ReglasNegocio.clsMenu _menu;

        //metodo de inicio. Carga de la pantalla incial
        protected void Page_Load(object sender, EventArgs e)
        {
            var = Session["Variables"] as Variables;
            LblTitulo.Text = "Perfiles";

            if (var == null)
                Response.Redirect("Login.aspx");
            else
            {
                _perfil = new ReglasNegocio.clsPerfil();
                _menu = new ReglasNegocio.clsMenu();

                //validamos la accion...
                string objeto = "";
                string[] objetoTemp;

                if (Request.Params["__EVENTTARGET"] != "" && Request.Params["__EVENTTARGET"] != null)
                {
                    objetoTemp = Request.Params["__EVENTTARGET"].ToString().Split('$');
                    objeto = objetoTemp[objetoTemp.Length - 1];
                }

                if (objeto != "linkNuevo" && objeto != "linkEditar" && objeto != "linkEliminar" && objeto != "linkAceptar" && objeto != "linkCancelar")
                {
                    if (objeto == "lnkBuscar")
                        gridDatos.CurrentPageIndex = 0;

                    LblMensaje.Visible = false;
                    gridDatos.DataSource = _perfil.ObtenerPerfil(var.Where, var.Orden);
                    gridDatos.DataBind();
                }
                else
                {
                    Accion.Value = lblAccion.Text;

                    //validamos la accion...
                    if (objeto == "linkNuevo")
                    {
                        linkNuevo_Click();
                    }
                    else if (objeto == "linkEditar")
                    {
                        linkEditar_Click(Request.Form["ctl00$Control2$Item_Id"]);
                    }
                    else if (objeto == "linkEliminar")
                    {
                        linkEliminar_Click(Request.Form["ctl00$Control2$Item_Id"]);
                    }
                    else if (objeto == "linkAceptar")
                    {
                        cargarMenues();
                    }
                }
            }
        }

        //Metodo para la creacion
        protected void linkNuevo_Click()
        {
            TablaListado.Visible = false;
            TablaDatos.Visible = true;
            TablaBotones.Visible = true;
            LblMensaje.Visible = true;
            LblMensaje.Text = "Ingrese el nuevo perfil";

            cargarListas();
            cargarMenues();

            //seteamos la variable de configuracion de nuevo
            Accion.Value = "1";
            lblAccion.Text = "1";
        }

        //Metodo para editar un elemento
        protected void linkEditar_Click(string itemid)
        {
            string id_item = itemid;
            TablaListado.Visible = false;
            TablaDatos.Visible = true;
            TablaBotones.Visible = true;
            LblMensaje.Visible = true;
            LblMensaje.Text = "Realice las modificaciones deseadas";

            DataTable datos = _perfil.ObtenerPerfilXId(Convert.ToInt32(id_item)).Tables[0];

            cargarListas();

            //llenamos los datos
            txtNombre.Text = datos.Rows[0]["Nombre"].ToString();
            txtDescripcion.Text = datos.Rows[0]["Descripcion"].ToString();
            ddlEstatus.SelectedValue = datos.Rows[0]["Estatus_Id"].ToString();

            //Se cargan los menúes
            cargarMenues();

            //Se asignan los permisos del perfil
            asignarPermisos(Convert.ToInt32(id_item));

            //seteamos las variables de configuracion de editar
            Accion.Value = "2";
            lblAccion.Text = "2";
            Item_Id.Value = id_item;
        }

        //Metodo para eliminar un elemento
        protected void linkEliminar_Click(string itemid)
        {
            string id_item = itemid;

            TablaListado.Visible = false;
            TablaDatos.Visible = false;
            TablaBotones.Visible = true;
            LblMensaje.Visible = true;
            LblMensaje.Text = "¿Está seguro que desea eliminar el perfil seleccionado?";

            //seteamos las variables de configuracion de editar
            Accion.Value = "3";
            lblAccion.Text = "3";
            Item_Id.Value = id_item;
        }

        //Metodo para Guardar los datos de un elemento nuevo, o uno existente 
        protected void linkAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                //Recuperamos los datos de los campos
                string Nombre = txtNombre.Text;
                string Descripcion = txtDescripcion.Text;
                string Estatus = ddlEstatus.SelectedValue;

                int duplicado = 0;
                DataTable dtDuplicado = new DataTable();

                if (Accion.Value == "1")//nuevo elemento
                {
                    dtDuplicado = _perfil.Agregar(Nombre, Descripcion, Convert.ToInt32(Estatus), Convert.ToInt32(var.CodigoUsuario)).Tables[0];

                    if (dtDuplicado.Rows.Count > 0)
                    {
                        if (dtDuplicado.Rows[0]["total"].ToString() == "0")
                        {
                            int IdPerfil = Convert.ToInt32(dtDuplicado.Rows[0]["Id"].ToString());

                            _perfil.EliminarMenuPerfil(IdPerfil);

                            //Busco todos los checks en el accordion y guardo en BD los permisos seleccionados
                            int i = 0;
                            //Recorro todos los panes del accordion
                            foreach (AjaxControlToolkit.AccordionPane item_pane in AccordionPermisos.Panes)
                            {
                                //Asigno los panes a controles que puedo manejar
                                string IdMenu = ((Label)item_pane.HeaderContainer.Controls[i]).Text;
                                string NombreMenu = ((Label)item_pane.HeaderContainer.Controls[i + 1]).Text;
                                CheckBoxList listaCheck = (CheckBoxList)item_pane.ContentContainer.Controls[i];
                                int Insert = 0;
                                int View = 0;
                                int Edit = 0;
                                int Delete = 0;

                                if (listaCheck.Items[0].Selected)
                                    Insert = 1;
                                if (listaCheck.Items[1].Selected)
                                    View = 1;
                                if (listaCheck.Items[2].Selected)
                                    Edit = 1;
                                if (listaCheck.Items[3].Selected)
                                    Delete = 1;

                                _perfil.AgregarMenuPerfil(Convert.ToInt32(IdMenu), IdPerfil, Insert, View, Edit, Delete);
                            }
                        }
                    }
                }
                else if (Accion.Value == "2")//editar elemento
                {
                    duplicado = _perfil.Editar(Convert.ToInt32(Item_Id.Value), Nombre, Descripcion, Convert.ToInt32(Estatus), Convert.ToInt32(var.CodigoUsuario));
                    
                    int IdPerfil = Convert.ToInt32(Item_Id.Value);

                    _perfil.EliminarMenuPerfil(IdPerfil);
                    //Busco todos los checks en el accordion y guardo en BD los permisos seleccionados
                    int i = 0;
                    //Recorro todos los panes del accordion
                    foreach (AjaxControlToolkit.AccordionPane item_pane in AccordionPermisos.Panes)
                    {
                        //Asigno los panes a controles que puedo manejar
                        string IdMenu = ((Label)item_pane.HeaderContainer.Controls[i]).Text;
                        string NombreMenu = ((Label)item_pane.HeaderContainer.Controls[i + 1]).Text;
                        CheckBoxList listaCheck = (CheckBoxList)item_pane.ContentContainer.Controls[i];
                        int Insert = 0;
                        int View = 0;
                        int Edit = 0;
                        int Delete = 0;

                        if (listaCheck.Items[0].Selected)
                            Insert = 1;
                        if (listaCheck.Items[1].Selected)
                            View = 1;
                        if (listaCheck.Items[2].Selected)
                            Edit = 1;
                        if (listaCheck.Items[3].Selected)
                            Delete = 1;

                        _perfil.AgregarMenuPerfil(Convert.ToInt32(IdMenu), IdPerfil, Insert, View, Edit, Delete);
                    }
                }
                else if (Accion.Value == "3")//eliminar elemento
                {
                    try
                    {
                        int IdPerfil = Convert.ToInt32(Item_Id.Value);
                        _perfil.EliminarMenuPerfil(IdPerfil);
                        _perfil.Eliminar(IdPerfil);
                        mostrarConfirmacion(Accion.Value, true);
                    }
                    catch (Exception ex)
                    {
                        mostrarConfirmacion(Accion.Value, false);
                    }
                }
                if ((duplicado == 0 && Accion.Value != "3")||(dtDuplicado.Rows[0]["total"].ToString() == "0" && Accion.Value != "3"))
                {
                    mostrarConfirmacion(Accion.Value, true);
                }
                else
                {
                    ScriptManager.RegisterStartupScript(Page, Page.GetType(), "Error", "<script language='javascript'>alert ('Registro duplicado: Ya existe un registro con este nombre. Por favor verifique los datos ingresados e intente nuevamente');</script>", false);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                mostrarConfirmacion("otro", false);
            }
        }

        //Metodo privado para limpiar los datos del formulario
        protected void limpiarDatos()
        {
            TablaListado.Visible = true;
            TablaDatos.Visible = false;
            TablaBotones.Visible = false;
            LblMensaje.Visible = false;
            TablaMensaje.Visible = false;

            //limpiar valores al cancelar.
            txtNombre.ReadOnly = false;
            txtDescripcion.Text = "";

            //cargamos el listado...
            gridDatos.DataSource = _perfil.ObtenerPerfil(var.Where, var.Orden);
            gridDatos.DataBind();
        }

        //Metodo para cancelar el ingreso o edicion de un elemento
        protected void linkCancelar_Click(object sender, EventArgs e)
        {
            limpiarDatos();
        }

        //Metodo para aceptar el mensajede confirmación y regresar a la pantalla con el listado
        protected void linkAceptar2_Click(object sender, EventArgs e)
        {
            limpiarDatos();
        }

        //Metodo para la paginacion del grid
        protected void gridDatos_PageIndexChanged(object source, DataGridPageChangedEventArgs e)
        {
            gridDatos.CurrentPageIndex = e.NewPageIndex;
            gridDatos.DataSource = _perfil.ObtenerPerfil(var.Where, var.Orden);
            gridDatos.DataBind();
        }

        protected void gridDatos_SortCommand(object source, DataGridSortCommandEventArgs e)
        {
            var.Orden = e.SortExpression;
            gridDatos.DataSource = _perfil.ObtenerPerfil(var.Where, var.Orden);
            gridDatos.DataBind();
            Session["Variables"] = var;
        }

        private void cargarListas()
        {
            ListItem item = new ListItem();

            //ESTATUS
            ReglasNegocio.clsComunes comunes = new ReglasNegocio.clsComunes();
            ddlEstatus.DataSource = comunes.ObtenerEstatusEstandar();
            ddlEstatus.DataTextField = "Nombre";
            ddlEstatus.DataValueField = "Id";
            ddlEstatus.DataBind();
            item = new ListItem();
            item.Text = "- Seleccione -";
            item.Value = "0";
            ddlEstatus.Items.Insert(0, item);

        }

        private void cargarMenues()
        {
            DataTable datosMenu = new DataTable();
            datosMenu = _menu.ObtenerMenuActivo().Tables[0];

            for (int I = 0; I < datosMenu.Rows.Count; I++)
            {
                //Creo el checklist con las opciones INSERTAR, CONSULTAR, EDITAR, ELIMINAR
                CheckBoxList listaCheck = new CheckBoxList();
                ListItem itemInsert = new ListItem();
                itemInsert.Text = "Insertar";
                itemInsert.Value = "1";
                ListItem itemView = new ListItem();
                itemView.Text = "Consultar";
                itemView.Value = "2";
                ListItem itemEdit = new ListItem();
                itemEdit.Text = "Modificar";
                itemEdit.Value = "3";
                ListItem itemDelete = new ListItem();
                itemDelete.Text = "Eliminar";
                itemDelete.Value = "4";

                listaCheck.Items.Add(itemInsert);
                listaCheck.Items.Add(itemView);
                listaCheck.Items.Add(itemEdit);
                listaCheck.Items.Add(itemDelete);

                AjaxControlToolkit.AccordionPane item_panel = new AjaxControlToolkit.AccordionPane();
                item_panel.EnableViewState = true;
                item_panel.ID = "Panel" + I;
                Label titulo1 = new Label();
                titulo1.Text = datosMenu.Rows[I]["Id"].ToString();
                titulo1.Visible = false;
                Label titulo2 = new Label();
                titulo2.Text = datosMenu.Rows[I]["Nombre"].ToString();
                item_panel.HeaderContainer.Controls.Add(titulo1);
                item_panel.HeaderContainer.Controls.Add(titulo2);
                item_panel.ContentContainer.Controls.Add(listaCheck);
                AccordionPermisos.Panes.Add(item_panel);
            }
        }

        private void asignarPermisos(int IdPerfil)
        {
            DataTable datosPermisos = new DataTable();
            datosPermisos = _perfil.ObtenerMenuXPerfil(IdPerfil).Tables[0];

            int i = 0;
            //Recorro todos los panes del accordion
            foreach (AjaxControlToolkit.AccordionPane item_pane in AccordionPermisos.Panes)
            {
                //Asigno los panes a controles que puedo manejar
                string headerPane = ((Label)item_pane.HeaderContainer.Controls[i + 1]).Text;
                CheckBoxList listaCheck = (CheckBoxList)item_pane.ContentContainer.Controls[i];

                //Recorro el datatable que me trajo los permisos
                foreach (DataRow permiso in datosPermisos.Rows)
                {
                    if (permiso["Nombre"].ToString() == headerPane)
                    {
                        listaCheck.Items[0].Selected = Convert.ToBoolean(permiso["Insertar"].ToString());
                        listaCheck.Items[1].Selected = Convert.ToBoolean(permiso["Consultar"].ToString());
                        listaCheck.Items[2].Selected = Convert.ToBoolean(permiso["Modificar"].ToString());
                        listaCheck.Items[3].Selected = Convert.ToBoolean(permiso["Eliminar"].ToString());
                    }
                }
            }
        }

        private void mostrarConfirmacion(string accionForm, bool esExitoso)
        {
            TablaDatos.Visible = false;
            TablaBotones.Visible = false;
            TablaListado.Visible = false;
            TablaMensaje.Visible = true;
            LblMensaje.Visible = false;

            if (accionForm == "1") //New
            {
                LblMensaje2.Text = "El perfil se ha registrado correctamente";
            }
            if (accionForm == "2") //Edit
            {
                LblMensaje2.Text = "El perfil se ha modificado correctamente";
            }
            if (accionForm == "3") //Delete
            {
                if (esExitoso)
                {
                    LblMensaje2.Text = "El perfil se ha eliminado correctamente";
                }
                else
                {
                    LblMensaje2.Text = "No se puede eliminar el perfil porque está relacionado a otros registros del sistema.";
                }
            }
            if ((accionForm == "otro") && (!esExitoso))
            {
                LblMensaje2.Text = "No se puede realizar la operación solicitada. <BR>Por favor intente nuevamente";
            }
        }

    }
}